package com.anosine.gpsl.android.receiver;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;

import com.anosine.gpsl.android.GPSLApp;
import com.anosine.gpsl.android.entity.Login;
import com.anosine.gpsl.android.entity.PushMessageBean;
import com.anosine.gpsl.android.ui.activity.ShowReceivePushActivity;
import com.anosine.gpsl.android.util.BundleKey;
import com.anosine.gpsl.android.util.UserInfoProxy;
import com.anosine.gpsl.android.util.ormdb.DaoHelper;
import com.baidu.android.pushservice.PushMessageReceiver;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 * 文件名：MyPushMessageReceiver 功 能： Push消息处理receiver。请编写您需要的回调函数， 一般来说：
 * onBind是必须的，用来处理startWork返回值； onMessage用来接收透传消息；
 * onSetTags、onDelTags、onListTags是tag相关操作的回调； onNotificationClicked在通知被点击时回调；
 * onUnbind是stopWork接口的返回值回调
 * 
 * 返回值中的errorCode，解释如下： 0 - Success 10001 - Network Problem 10101 Integrate
 * Check Error 30600 - Internal Server Error 30601 - Method Not Allowed 30602 -
 * Request Params Not Valid 30603 - Authentication Failed 30604 - Quota Use Up
 * Payment Required 30605 -Data Required Not Found 30606 - Request Time Expires
 * Timeout 30607 - Channel Token Timeout 30608 - Bind Relation Not Found 30609 -
 * Bind Number Too Many
 * 
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。 　作 者： 　时
 * 间：2015-10-16 　版 权：公司
 */
public class MyPushMessageReceiver extends PushMessageReceiver {
	/** TAG to Log */
	public static final String TAG = MyPushMessageReceiver.class
			.getSimpleName();

	/**
	 * 方法名：onBind(Context context, int errorCode, String appid, String userId,
	 * String channelId, String requestId) 功
	 * 能：调用PushManager.startWork后，sdk将对push
	 * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
	 * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
	 * 
	 * @param context
	 *            BroadcastReceiver的执行Context
	 * @param errorCode
	 *            绑定接口返回值，0 - 成功
	 * @param appid
	 *            应用id。errorCode非0时为null
	 * @param userId
	 *            应用user id。errorCode非0时为null
	 * @param channelId
	 *            应用channel id。errorCode非0时为null
	 * @param requestId
	 *            向服务端发起的请求id。在追查问题时有用；
	 * @return none
	 */

	@Override
	public void onBind(Context context, int errorCode, String appid,
			String userId, String channelId, String requestId) {
		String responseString = "onBind errorCode=" + errorCode + " appid="
				+ appid + " userId=" + userId + " channelId=" + channelId
				+ " requestId=" + requestId;
		GPSLApp.setuserId(userId);
		GPSLApp.setchannelId(channelId);
				
		Log.i("TAG8", "00000||||" + channelId);
		if (errorCode == 0) {
			// 绑定成功
		}
		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, responseString);
	}

	/**
	 * 方法名：onMessage(Context context, String message, String
	 * customContentString) 功 能： 接收透传消息的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param message
	 *            推送的消息
	 * @param customContentString
	 *            自定义内容,为空或者json字符串
	 * @return 无
	 */
	@Override
	public void onMessage(Context context, String message,
			String customContentString) {
		String messageString = "透传消息 message=\"" + message
				+ "\" customContentString=" + customContentString;
		Log.d("TAG23", messageString);

		// 自定义内容获取方式，mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
		if (!TextUtils.isEmpty(customContentString)) {
			JSONObject customJson = null;
			try {
				customJson = new JSONObject(customContentString);
				String myvalue = null;
				if (!customJson.isNull("mykey")) {
					myvalue = customJson.getString("mykey");
				}
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, messageString);
		/////////////解析透传消息////////////////
		String getMessage="";
		JsonObject object = new JsonParser().parse(message)
				.getAsJsonObject();		
		String title=object.get("title").getAsString();
			if("1".equals(title)){
				getMessage=object.get("description").getAsString();
				GPSLApp.setMessage(getMessage);
				Intent i = new Intent();
				i.putExtra("message", getMessage);
				i.setAction("PushPassThrough");
				context.getApplicationContext().sendBroadcast(i);
			}		
		
	}

	/**
	 * 方法名： 功 能：接收通知点击的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param title
	 *            推送的通知的标题
	 * @param description
	 *            推送的通知的描述
	 * @param customContentString
	 *            自定义内容，为空或者json字符串
	 * @return 无
	 */
	
	@Override
	public void onNotificationClicked(Context context, String title,
			String description, String customContentString) {
		String notifyString = "通知点击 title=\"" + title + "\" description=\""
				+ description + "\" customContent=" + customContentString;
		Log.d(TAG, notifyString);
		
		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, notifyString);
		//描述处理		
		if (pushMessageDao == null) {
			pushMessageDao = new DaoHelper<PushMessageBean>(
					GPSLApp.getInstance(), PushMessageBean.class);
		}
		PushMessageBean info = new PushMessageBean();
		SimpleDateFormat sdfAllShow = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");		
		SharedPreferences sharedPreferences1 = context.getApplicationContext()
				.getSharedPreferences("PushMessageId", Context.MODE_PRIVATE);
		int infoId = sharedPreferences1.getInt("PushMessageBeanId", 0);
		Login userInfo = UserInfoProxy.getInstance().getLoginInfo();
		info.setId("" + infoId);
		info.setTitle(title );
		info.setDesc(description);
		info.setHn("");
		info.setDate(sdfAllShow.format(new Date()));
		info.setHid(userInfo.holdid);
		pushMessageDao.create(info);

		SharedPreferences sharedPreferences = context.getApplicationContext()
				.getSharedPreferences("PushMessageId",
						Context.MODE_WORLD_READABLE);
		Editor editor = sharedPreferences.edit();
		editor.putInt("PushMessageBeanId", ++infoId);
		editor.commit();		
		//已改
		Bundle args = new Bundle();
		args.putSerializable(BundleKey.TAG_SCENERY_DATA, info);
		Intent intent = new Intent();
		intent.setClass(context.getApplicationContext(),
				ShowReceivePushActivity.class);
		//intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);

		intent.putExtras(args);
		context.getApplicationContext().startActivity(intent);
		
	}
	private boolean IsRun(Context context){
		//判断应用是否在前台运行 
    	ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    	List<RunningTaskInfo> list = am.getRunningTasks(1);
    	boolean isAppRunning = false;
    	String MY_PKG_NAME = "com.playlook.soft.lovecar.main";
    	for (RunningTaskInfo infoo : list) {
    	if (infoo.topActivity.getPackageName().equals(MY_PKG_NAME) || infoo.baseActivity.getPackageName().equals(MY_PKG_NAME)) {
    	isAppRunning = true;
    	break;
    	}
    	}
    	return isAppRunning;
	}
	/**
	 * 方法名：onNotificationArrived(Context context, String title, String
	 * description, String customContentString) 功 能： 接收通知到达的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param title
	 *            推送的通知的标题
	 * @param description
	 *            推送的通知的描述
	 * @param customContentString
	 *            自定义内容，为空或者json字符串
	 * @return none
	 */

	@Override
	public void onNotificationArrived(Context context, String title,
			String description, String customContentString) {
		String notifyString = "onNotificationArrived  title=\"" + title
				+ "\" description=\"" + description + "\" customContent="
				+ customContentString;
		Log.d(TAG, notifyString);

		// 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
		if (!TextUtils.isEmpty(customContentString)) {
			JSONObject customJson = null;
			try {
				customJson = new JSONObject(customContentString);
				String myvalue = null;
				if (!customJson.isNull("mykey")) {
					myvalue = customJson.getString("mykey");
				}
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		// 你可以參考 onNotificationClicked中的提示从自定义内容获取具体值
		updateContent(context, notifyString);



	}
	private DaoHelper<PushMessageBean> pushMessageDao;

	/**
	 * 　方法名： onSetTags(Context context, int errorCode, List<String> sucessTags,
	 * List<String> failTags, String requestId) 功 能：setTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
	 * @param successTags
	 *            设置成功的tag
	 * @param failTags
	 *            设置失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id
	 * @return none
	 */
	@Override
	public void onSetTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onSetTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, responseString);
	}

	/**
	 * 方法名：onDelTags(Context context, int errorCode, List<String> sucessTags,
	 * List<String> failTags, String requestId) 功 能：delTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
	 * @param successTags
	 *            成功删除的tag
	 * @param failTags
	 *            删除失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id 返回值：无
	 */
	@Override
	public void onDelTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onDelTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, responseString);
	}

	/**
	 * 方法名：onListTags(Context context, int errorCode, List<String> tags, String
	 * requestId) 功 能：listTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示列举tag成功；非0表示失败。
	 * @param tags
	 *            当前应用设置的所有tag。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 * @return none
	 */
	@Override
	public void onListTags(Context context, int errorCode, List<String> tags,
			String requestId) {
		String responseString = "onListTags errorCode=" + errorCode + " tags="
				+ tags;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, responseString);
	}

	/**
	 * 方法名：onUnbind(Context context, int errorCode, String requestId)
	 * 
	 * 功 能：PushManager.stopWork() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示从云推送解绑定成功；非0表示失败。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 * @return none
	 */
	@Override
	public void onUnbind(Context context, int errorCode, String requestId) {
		String responseString = "onUnbind errorCode=" + errorCode
				+ " requestId = " + requestId;
		Log.d(TAG, responseString);

		if (errorCode == 0) {
			// 解绑定成功
		}
		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
		updateContent(context, responseString);
	}

	/**
	 * 方法名：updateContent(Context context, String content) 功 能：自定义函数，处理业务逻辑
	 * 
	 * @param Context
	 *            上下文
	 * @param String
	 *            content 推送返回值 返回值：无
	 */

	private void updateContent(Context context, String content) {
		
	}
}
